#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <climits>

using namespace std;

struct Item {
    int id;
    int value;
    int weight;
};

int main(int argc, char* argv[]) {

    // 检查是否提供了文件路径参数
    if (argc < 2) {
        cerr << "Usage: " << argv[0] << " <filepath>" << endl;
        return 1;
    }
    
    string filepath = argv[1];  // 获取文件路径参数

    int n, value, weight;
    long long capacity;  // 改为 long long 以支持更大的容量
    
    // UU格式：第一行是 "n capacity"
    cin >> n >> capacity;
    
    vector<Item> items(n);
    for (int i = 0; i < n; ++i) {
        // UU格式：每行是 "value weight"，没有id
        cin >> value >> weight;
        items[i] = {i+1, value, weight};  // 自动分配id
    }

    if(n > 100000 || capacity > 1000000){
        cout << filepath << "," << -2 << endl;
        return 0;
    }

    // DP解法
    // dp[i][j]表示前i个物品，容量为j时的最大价值
    // 改为 vector<vector<long long>> 以支持更大的价值
    vector<vector<long long>> dp(n + 1, vector<long long>(capacity + 1, 0));

    for (int i = 1; i <= n; ++i) {
        for (long long j = 1; j <= capacity; ++j) {
            // 当前物品的重量和价值
            int current_weight = items[i-1].weight;
            int current_value = items[i-1].value;
            
            if (current_weight > j) {
                // 当前物品太重，无法装入
                dp[i][j] = dp[i-1][j];
            } else {
                // 选择装入或不装入当前物品，取较大值
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-current_weight] + current_value);
            }
        }
    }

    // 输出结果：只需要输出最大价值，Python代码会处理文件名
    long long total_value = dp[n][capacity];
    cout << filepath << "," << total_value << endl;

    return 0;
} 